/**   
* @Title: Watson.java 
* @Package android.support.v4.app 
* @Description: 
*			声明:
*			1)掌控校园是本人的大学的创业作品,也是本人的毕业设计
*			2)本程序尚未进行开放源代码,所以禁止组织或者是个人泄露源码,否则将会追究其刑事责任
*			3)编写本软件,我需要感谢彭老师以及其他鼓励和支持我的同学以及朋友
*			4)本程序的最终所有权属于本人	
* @author  张雷 794857063@qq.com
* @date 2013-11-14 19:34:15 
* @version V1.0   
*/
package android.support.v4.app;

import android.util.Log;
import android.view.View;
import android.view.Window;
import com.actionbarsherlock.ActionBarSherlock.OnCreatePanelMenuListener;
import com.actionbarsherlock.ActionBarSherlock.OnMenuItemSelectedListener;
import com.actionbarsherlock.ActionBarSherlock.OnPreparePanelListener;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;

import java.util.ArrayList;

// TODO: Auto-generated Javadoc
/** I'm in ur package. Stealing ur variables. */
public abstract class Watson extends FragmentActivity implements
		OnCreatePanelMenuListener, OnPreparePanelListener,
		OnMenuItemSelectedListener {
	
	/** The Constant DEBUG. */
	private static final boolean DEBUG = false;
	
	/** The Constant TAG. */
	private static final String TAG = "Watson";

	/**
	 * Fragment interface for menu creation callback.
	 * 
	 * @see OnCreateOptionsMenuEvent
	 */
	public interface OnCreateOptionsMenuListener {
		
		/**
		 * On create options menu.
		 * 
		 * @param menu
		 *            the menu
		 * @param inflater
		 *            the inflater
		 */
		public void onCreateOptionsMenu(Menu menu, MenuInflater inflater);
	}

	/**
	 * Fragment interface for menu preparation callback.
	 * 
	 * @see OnPrepareOptionsMenuEvent
	 */
	public interface OnPrepareOptionsMenuListener {
		
		/**
		 * On prepare options menu.
		 * 
		 * @param menu
		 *            the menu
		 */
		public void onPrepareOptionsMenu(Menu menu);
	}

	/**
	 * Fragment interface for menu item selection callback.
	 * 
	 * @see OnOptionsItemSelectedEvent
	 */
	public interface OnOptionsItemSelectedListener {
		
		/**
		 * On options item selected.
		 * 
		 * @param item
		 *            the item
		 * @return true, if successful
		 */
		public boolean onOptionsItemSelected(MenuItem item);
	}

	/** The m created menus. */
	private ArrayList<Fragment> mCreatedMenus;

	// /////////////////////////////////////////////////////////////////////////
	// Sherlock menu handling
	// /////////////////////////////////////////////////////////////////////////

	/** 
	* <p>Title: onCreatePanelMenu</p> 
	* <p>Description: </p> 
	* @param featureId
	* @param menu
	* @return 
	* @see android.support.v4.app.FragmentActivity#onCreatePanelMenu(int, android.view.Menu) 
	*/
	@Override
	public boolean onCreatePanelMenu(int featureId, Menu menu) {
		if (DEBUG)
			Log.d(TAG, "[onCreatePanelMenu] featureId: " + featureId
					+ ", menu: " + menu);

		if (featureId == Window.FEATURE_OPTIONS_PANEL) {
			boolean result = onCreateOptionsMenu(menu);
			if (DEBUG)
				Log.d(TAG, "[onCreatePanelMenu] activity create result: "
						+ result);

			MenuInflater inflater = getSupportMenuInflater();
			boolean show = false;
			ArrayList<Fragment> newMenus = null;
			if (mFragments.mAdded != null) {
				for (int i = 0; i < mFragments.mAdded.size(); i++) {
					Fragment f = mFragments.mAdded.get(i);
					if (f != null && !f.mHidden && f.mHasMenu && f.mMenuVisible
							&& f instanceof OnCreateOptionsMenuListener) {
						show = true;
						((OnCreateOptionsMenuListener) f).onCreateOptionsMenu(
								menu, inflater);
						if (newMenus == null) {
							newMenus = new ArrayList<Fragment>();
						}
						newMenus.add(f);
					}
				}
			}

			if (mCreatedMenus != null) {
				for (int i = 0; i < mCreatedMenus.size(); i++) {
					Fragment f = mCreatedMenus.get(i);
					if (newMenus == null || !newMenus.contains(f)) {
						f.onDestroyOptionsMenu();
					}
				}
			}

			mCreatedMenus = newMenus;

			if (DEBUG)
				Log.d(TAG, "[onCreatePanelMenu] fragments create result: "
						+ show);
			result |= show;

			if (DEBUG)
				Log.d(TAG, "[onCreatePanelMenu] returning " + result);
			return result;
		}
		return false;
	}

	/** 
	* <p>Title: onPreparePanel</p> 
	* <p>Description: </p> 
	* @param featureId
	* @param view
	* @param menu
	* @return 
	* @see android.support.v4.app.FragmentActivity#onPreparePanel(int, android.view.View, android.view.Menu) 
	*/
	@Override
	public boolean onPreparePanel(int featureId, View view, Menu menu) {
		if (DEBUG)
			Log.d(TAG, "[onPreparePanel] featureId: " + featureId + ", view: "
					+ view + " menu: " + menu);

		if (featureId == Window.FEATURE_OPTIONS_PANEL) {
			boolean result = onPrepareOptionsMenu(menu);
			if (DEBUG)
				Log.d(TAG, "[onPreparePanel] activity prepare result: "
						+ result);

			boolean show = false;
			if (mFragments.mAdded != null) {
				for (int i = 0; i < mFragments.mAdded.size(); i++) {
					Fragment f = mFragments.mAdded.get(i);
					if (f != null && !f.mHidden && f.mHasMenu && f.mMenuVisible
							&& f instanceof OnPrepareOptionsMenuListener) {
						show = true;
						((OnPrepareOptionsMenuListener) f)
								.onPrepareOptionsMenu(menu);
					}
				}
			}

			if (DEBUG)
				Log.d(TAG, "[onPreparePanel] fragments prepare result: " + show);
			result |= show;

			result &= menu.hasVisibleItems();
			if (DEBUG)
				Log.d(TAG, "[onPreparePanel] returning " + result);
			return result;
		}
		return false;
	}

	/** 
	* <p>Title: onMenuItemSelected</p> 
	* <p>Description: </p> 
	* @param featureId
	* @param item
	* @return 
	* @see android.support.v4.app.FragmentActivity#onMenuItemSelected(int, android.view.MenuItem) 
	*/
	@Override
	public boolean onMenuItemSelected(int featureId, MenuItem item) {
		if (DEBUG)
			Log.d(TAG, "[onMenuItemSelected] featureId: " + featureId
					+ ", item: " + item);

		if (featureId == Window.FEATURE_OPTIONS_PANEL) {
			if (onOptionsItemSelected(item)) {
				return true;
			}

			if (mFragments.mAdded != null) {
				for (int i = 0; i < mFragments.mAdded.size(); i++) {
					Fragment f = mFragments.mAdded.get(i);
					if (f != null && !f.mHidden && f.mHasMenu && f.mMenuVisible
							&& f instanceof OnOptionsItemSelectedListener) {
						if (((OnOptionsItemSelectedListener) f)
								.onOptionsItemSelected(item)) {
							return true;
						}
					}
				}
			}
		}
		return false;
	}

	/** 
	* <p>Title: onCreateOptionsMenu</p> 
	* <p>Description: </p> 
	* @param menu
	* @return 
	* @see android.app.Activity#onCreateOptionsMenu(android.view.Menu) 
	*/
	public abstract boolean onCreateOptionsMenu(Menu menu);

	/** 
	* <p>Title: onPrepareOptionsMenu</p> 
	* <p>Description: </p> 
	* @param menu
	* @return 
	* @see android.app.Activity#onPrepareOptionsMenu(android.view.Menu) 
	*/
	public abstract boolean onPrepareOptionsMenu(Menu menu);

	/** 
	* <p>Title: onOptionsItemSelected</p> 
	* <p>Description: </p> 
	* @param item
	* @return 
	* @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem) 
	*/
	public abstract boolean onOptionsItemSelected(MenuItem item);

	/**
	 * Gets the support menu inflater.
	 * 
	 * @return the support menu inflater
	 */
	public abstract MenuInflater getSupportMenuInflater();
}
